package com.ganzalang.gmall.command.inventory.updater;

import com.ganzalang.gmall.command.api.dto.SubOrderVariantDTO;
import com.ganzalang.gmall.command.domain.ProductVariantInventory;
import com.ganzalang.gmall.command.service.ProductVariantInventoryService;
import org.springframework.context.ApplicationEventPublisher;

import java.util.List;
import java.util.Map;

/**
 * @program: saas-shoplus-product-parent
 * @description: 比较库存,查看是否可售,不对库存做操作
 * @author: jingyang
 * @create: 2020-08-13 14:29
 **/
public class VerifySaleInventoryUpdater extends AbstractInventoryUpdater{

    /**
     * 用户下单对应商品的DTO对象
     */
    private Map<Long, SubOrderVariantDTO> subOrderVariantDTOMap;

    /**
     * 构造方法
     * @param inventoryService 商品库存service组件
     * @param productVariantInventories 商品库存DO对象
     * @param subOrderVariantDTOMap 用户下单对应商品的DTO对象Map,key:skuId,value:对应的数量
     */
    public VerifySaleInventoryUpdater(
            ProductVariantInventoryService inventoryService,
            List<ProductVariantInventory> productVariantInventories,
            Map<Long,SubOrderVariantDTO> subOrderVariantDTOMap,
            ApplicationEventPublisher publisher,
            Long shopId) {
        super(inventoryService, productVariantInventories, publisher, shopId);
        this.subOrderVariantDTOMap = subOrderVariantDTOMap;
    }

    /**
     * 更新可用库存
     */
    @Override
    protected void updateAvailableInventory() {
        for (ProductVariantInventory inventory : productVariantInventories) {
            SubOrderVariantDTO subOrderVariantDTO = subOrderVariantDTOMap.get(inventory.getSkuId());
                //循环减库存,如果其中一个扣减失败,则回滚之前的库存
                Boolean isSuccess = inventoryService.verifyInventory(
                        subOrderVariantDTO.getShopId(),
                        subOrderVariantDTO.getSpuId(),
                        subOrderVariantDTO.getSkuId(),
                        subOrderVariantDTO.getQuantity());
                //如果扣减失败,则抛出异常
//                CommonAssertUtil.assertTrue(isSuccess,
//                        ShoplusProductException.DECREASE_INVENTORY_ERROR.format(subOrderVariantDTO.getVariantId()));
        }
        productVariantInventories = null;
    }

    /**
     * 更新锁定库存
     */
    @Override
    protected void updateLockInventory() {

    }

    /**
     * 更新库存日志表
     */
    @Override
    protected void updateInventoryLog() {

    }

    /**
     * 回滚操作
     */
    @Override
    protected void rollback() {

    }
}
